梅森素数
性质
本节研究 素数。
通过下表观察可得知:
- 是奇数时, 是偶数。 所以 只能为偶数。
- 总是被 整除。
证明:几何级数公式(Geometric Series)
展开右边乘法即可证明几何级数。
所以只能为2。
观察下表的情况:
- 不是所有都是素数。
- 如果 被整除,则被整除。
观察
如果是偶数,被整除。
如果被3整除,被整除。
如果被5整除,被整除。
证明:同样利用几何级数公式,
所以一定是素数。
命题1. 如果整数与,如果是素数,则一定等于2且一定是素数。
Proposition 1. If is prime for some numbers and , then a must equal 2 and n must be a prime.
- 不是所有的都是素数。
应用
在密码学中,有限域中的运算性能极大影响密码协议的实现。在这些运算中,逆运算是最复杂的,模运算、乘法次之。
如果有限域选择梅森素数,得益于它的优良性质,可以极大提高运算效率,特别是有限域下的模运算、乘法操作。
Modular Reduction
根据性质:
可得:
如果将写作比特形式,模运算约减为将高位比特串和低位比特串相加。
C++伪代码实现(以为例):
代码
#define MERSENNE_PRIME_EXP 61 const uint64_t PR = 2305843009213693951; //2^61-1 uint64_t mod(uint64_t x) { uint64_t i = (x & PR) + (x >> MERSENNE_PRIME_EXP); return (i>=p) ? i - p: i; }
Multiplication
以为例,和相乘后,得到一个最多122-bit的数字,用同样的方法,将高位比特和低位比特相加。(如果结果更长,就按段一直叠加)
在实现上可以使用64-bit乘法优化(可以用指令集加速):
代码
/** * @brief 64-bit multiplication * * @param a * @param b * @param c [out]pointer to hign 64-bit * @return uint64_t [out]low 64-bit */ #if defined(__x86_64__) && defined(__BMI2__) inline uint64_t mul64(uint64_t a, uint64_t b, uint64_t *c) { return _mulx_u64((unsigned long long)a, (unsigned long long)b, (unsigned long long*)c); } #else inline uint64_t mul64(uint64_t a, uint64_t b, uint64_t *c) { __uint128_t aa = a; __uint128_t bb = b; auto cc = aa*bb; // c is a pointer to high 64-bit *c = cc>>64; // return low 64-bit return (uint64_t)cc; } #endif inline uint64_t mult_mod(uint64_t a, uint64_t b) { uint64_t c = 0; uint64_t e = mul64(a, b, (uint64_t*)&c); // c is hign 64-bit // e is low 64-bit uint64_t ret = (e & PR) + ( (e>>MERSENNE_PRIME_EXP) ^ (c<< (64-MERSENNE_PRIME_EXP))); return (ret >= PR) ? (ret-PR) : ret; }
Reference
- 数论概论(原书第4版本) A Friendly Introduction to Number Theory.
- 代码参考于emp-zk.